'''
    属性和方法都适用
    _   表示受保护的变量（约定）
    __  表示私有变量
'''


class Person:
    def __init__(self, name, age):
        self._name = name  # 表示受保护的变量（约定）
        self.__age = age  # 表示私有变量

    def get_age(self):
        return self.__age


    @property  # 通过 @property 装饰器 将一个方法的调用变成属性的调用，调用方式 实例.retrieve_age
    def retrieve_age(self):
        print("获取age的值 ", end="")
        return self.__age

    @retrieve_age.setter  # 修改变量 retrieve_age 为 @property 修饰的方法名，调用方式 实例.retrieve_age = 新的值
    def retrieve_age(self, age):
        if isinstance(age, int):
            self.__age = age
        else:
            raise Exception('age must be an integer')

    def __private_method(self):
        print("私有方法")


per = Person("张三", 20)
print(per.get_age())
print(per.retrieve_age)
# per.retrieve_age(25) # 错误的写法，因为 retrieve_age 被当作了一个属性
per.retrieve_age = 25
print(per.get_age())
# print(per.__age) 无法调用
